/*
 *   
 *
 * Copyright  1990-2009 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */

//-----------------------------------------------------------------------------
// PACKAGE DEFINITION
//-----------------------------------------------------------------------------
package sim.toolkit;

//-----------------------------------------------------------------------------
// IMPORTS
//-----------------------------------------------------------------------------

/**
 *
 * This class is the basic class for the definition of 
 * <b>Proactive commands
 * </b>. Low level methods, as <code>init()</code>, <code>appendTLV()</code>...
 * will be used to handle generic Proactive commands (standard or future
 * definitions...). The ProactiveHandler class is a <b>Temporary JCRE Entry 
 * Point Object</b>.
 * The Toolkit applets, which need to send Proactive commands,
 * shall call the <code>getTheHandler()</code> static method to get the
 * reference of this system instance.<p>
 *
 * Example of use:<pre><code>
 *                                      // constants definition
 * private static final byte MY_COMMAND = (byte)0x33;
 * private static final byte MY_TAG     = (byte)0x45;
 *
 * ProactiveHandler proHdlr;            // get the system instance
 * proHdlr = ProactiveHandler.getTheHandler();
 *
 *                                      // build and send a new Proactive 
 *                                      // command
 * proHdlr.init(MY_COMMAND, (byte)0, DEV_ID_ME);
 * proHdlr.appendTLV((byte)(MY_TAG | TAG_SET_CR),
 *                (byte)0);
 * short len = proHdlr.getLength();     // length should be 14 !
 * byte result = proHdlr.send();
 *
 * private byte[] text = new byte[12];  // byte array definition
 * text[0] = (byte)'S';                 // text, in 8-bit format, is "SAT"
 * text[1] = (byte)'A';
 * text[2] = (byte)'T';
 *                                      // build and send a DisplayText command
 * result = proHdlr.initDisplayText((byte)0x80, DCS_8_BIT_DATA, 
 *                                  text, (short)0, (short)3);
 * result = proHdlr.send();
 * </code></pre>
 *
 * @version 8.3.0
 *
 * @see ViewHandler
 * @see EditHandler
 * @see ProactiveResponseHandler
 * @see ToolkitException
 */
public final class ProactiveHandler extends EditHandler {

    // ------------------------------- Constructors ---------------------------
    /**
     * Constructor
     */
    private ProactiveHandler() {
    }


    // ------------------------------- Public methods -------------------------
    /**
     * Returns the single system instance of the ProactiveHandler class. 
     * The applet shall get the reference of the handler at its triggering, 
     * the beginning of the processToolkit method.
     *
     * @return reference of the system instance
     *
     * @exception ToolkitException with the following reason codes: <ul>
     *      <li><code>HANDLER_NOT_AVAILABLE</code> if the handler is busy.</ul>
     */
    public static ProactiveHandler getTheHandler() throws ToolkitException {
        return null;
    }

    /**
     * Initializes the next Proactive command with Command Details and Device
     * Identities TLV.
     * The source device is always the SIM card. The command number is
     * generated by the method. The Comprehension Required flags are set.
     * After the method invocation no TLV is selected.
     *
     * @param type the command type
     * @param qualifier the command qualifier
     * @param dstDevice the destination device
     */
    public void init(byte type,
                     byte qualifier,
                     byte dstDevice) {
    }

    /**
     * Sends the current Proactive command.
     *
     * @return general result of the command (first byte of Result TLV in 
     * Terminal Response)
     *
     * @exception ToolkitException with the following reason codes: <ul>
     *      <li><code>UNAVAILABLE_ELEMENT</code> if the Result Simple TLV 
     *      is missing.
     *      <li><code>OUT_OF_TLV_BOUNDARIES</code> if the general result 
     *      byte is missing in the Result Simple TLV.</ul>
     */
    public byte send() throws ToolkitException {
        return 0;
    }

    /**
     * Builds a Display Text Proactive command without sending the command. 
     * The Comprehension
     * Required flags are all set to 1.
     * After the method invocation no TLV is selected.
     *
     * <p>
     * Notes:<ul>
     * <li><em>If </em><code>offset</code><em> or </em><code>length</code><em> 
     * parameter is negative an 
     * </em><code>ArrayIndexOutOfBoundsException</code>
     * <em> exception is thrown and no proactive command is build.</em>
     * <li><em>If </em><code>offset+length</code><em> is greater than 
     * </em><code>buffer.length</code><em>, the length
     * of the </em><code>buffer</code><em> array an 
     * </em><code>ArrayIndexOutOfBoundsException</code><em> exception is thrown
     * and no proactive command is build.</em> 
     * </ul> 
     *
     * @param qualifier Display Text command qualifier
     * @param dcs data coding scheme
     * @param buffer reference to the text string source buffer
     * @param offset offset of the text string in the source buffer
     * @param length length of the text string in the source buffer
     *
     * @exception NullPointerException if <code>buffer</code> is 
     * <code>null</code>
     * @exception ArrayIndexOutOfBoundsException if initDisplayText would 
     * cause access of data outside array bounds
     * @exception ToolkitException with the following reason codes: <ul>
     *      <li><code>HANDLER_OVERFLOW</code> if the ProactiveHandler buffer 
     *          is to small to put the requested data </ul>
     */
    public void initDisplayText(byte qualifier,
                                byte dcs,
                                byte[] buffer,
                                short offset,
                                short length) throws NullPointerException,
                                            ArrayIndexOutOfBoundsException,
                                            ToolkitException {
    }

    /**
     * Builds a Get Inkey Proactive command without sending the command. 
     * The Comprehension
     * Required flags are all set to 1.
     * After the method invocation no TLV is selected.
     *
     * <p>
     * Notes:<ul>
     * <li><em>If </em><code>offset</code><em> or 
     * </em><code>length</code><em> parameter is negative an 
     * </em><code>ArrayIndexOutOfBoundsException</code>
     * <em> exception is thrown and no proactive command is build.</em>
     * <li><em>If </em><code>offset+length</code><em> is greater than 
     * </em><code>buffer.length</code><em>, the length
     * of the </em><code>buffer</code><em> array an 
     * </em><code>ArrayIndexOutOfBoundsException</code><em> exception 
     * is thrown and no proactive command is build.</em> 
     * </ul> 
     *
     * @param qualifier Get Inkey command qualifier
     * @param dcs data coding scheme
     * @param buffer reference to the displayed text string source buffer
     * @param offset offset of the displayed text string in the source buffer
     * @param length length of the displayed text string in the source buffer
     *
     * @exception NullPointerException if <code>buffer</code> is 
     * <code>null</code>
     * @exception ArrayIndexOutOfBoundsException if initGetInkey would 
     * cause access of data outside array bounds.
     * @exception ToolkitException with the following reason codes: <ul>
     *      <li><code>HANDLER_OVERFLOW</code> if the ProactiveHandler buffer
     *      is to small to put the requested data</ul>	  
     */
    public void initGetInkey(byte qualifier,
                             byte dcs,
                             byte[] buffer,
                             short offset,
                             short length) throws NullPointerException,
                                        ArrayIndexOutOfBoundsException,
                                        ToolkitException {
    }

    /**
     * Initialize the building of a Get Input Proactive command. The 
     * Comprehension Required flags are all set to 1.
     * The following command parameters (i.e. TLVs) may be appended to the
     * command before sending it: Default Text.
     * After the method invocation no TLV is selected.
     *
     * <p>
     * Notes:<ul>
     * <li><em>If </em><code>offset</code><em> or </em><code>length</code><em>
     * parameter is negative an 
     * </em><code>ArrayIndexOutOfBoundsException</code>
     * <em> exception is thrown and no proactive command is build.</em>
     * <li><em>If </em><code>offset+length</code><em>is greater than 
     * </em><code>buffer.length</code><em>, the length
     * of the </em><code>buffer</code><em> array an 
     * </em><code>ArrayIndexOutOfBoundsException</code><em> exception is thrown
     * and no proactive command is build.</em> 
     * </ul> 
     *
     * @param qualifier Get Input command qualifier
     * @param dcs data coding scheme
     * @param buffer reference to the displayed text string source buffer
     * @param offset offset of the displayed text string in the source buffer
     * @param length length of the displayed text string in the source buffer
     * @param minRespLength minimal length of the response text string
     * @param maxRespLength maximal length of the response text string
     *
     * @exception NullPointerException if <code>buffer</code> is 
     * <code>null</code>
     * @exception ArrayIndexOutOfBoundsException if initGetInput would cause 
     * access of data outside array bounds.
     * @exception ToolkitException with the following reason codes: <ul>
     *      <li><code>HANDLER_OVERFLOW</code> if the ProactiveHandler buffer
     *      is to small to put the requested data</ul>
     */
    public void initGetInput(byte qualifier,
                             byte dcs,
                             byte[] buffer,
                             short offset,
                             short length,
                             short minRespLength,
                             short maxRespLength) throws NullPointerException,
                                                ArrayIndexOutOfBoundsException,
                                                ToolkitException {
    }
}
